package com.easysettle.utils

import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.widget.Toast
import androidx.core.content.FileProvider
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.*

/**
 * 工具类，提供一些通用的工具方法
 */
object Utils {
    private const val TAG = "Utils"
    
    /**
     * 显示Toast消息
     */
    fun showToast(context: Context, message: String) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
    }
    
    /**
     * 显示长Toast消息
     */
    fun showLongToast(context: Context, message: String) {
        Toast.makeText(context, message, Toast.LENGTH_LONG).show()
    }
    
    /**
     * 创建图片文件
     */
    @Throws(IOException::class)
    fun createImageFile(context: Context): File {
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
        val storageDir: File = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)!!
        return File.createTempFile(
            "JPEG_${timeStamp}_", /* 前缀 */
            ".jpg", /* 后缀 */
            storageDir /* 目录 */
        )
    }
    
    /**
     * 保存图片到文件
     */
    fun saveBitmapToFile(bitmap: Bitmap, filePath: String): Boolean {
        return try {
            val file = File(filePath)
            val parentDir = file.parentFile
            if (parentDir != null && !parentDir.exists()) {
                parentDir.mkdirs()
            }
            
            val outputStream = FileOutputStream(file)
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream)
            outputStream.flush()
            outputStream.close()
            true
        } catch (e: IOException) {
            Log.e(TAG, "保存图片失败: ${e.message}")
            false
        }
    }
    
    /**
     * 从文件加载图片
     */
    fun loadBitmapFromFile(filePath: String): Bitmap? {
        return try {
            val file = File(filePath)
            if (file.exists()) {
                BitmapFactory.decodeFile(filePath)
            } else {
                null
            }
        } catch (e: Exception) {
            Log.e(TAG, "加载图片失败: ${e.message}")
            null
        }
    }
    
    /**
     * 获取文件的Uri
     */
    fun getFileUri(context: Context, file: File): Uri {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            FileProvider.getUriForFile(
                context,
                "${context.packageName}.fileprovider",
                file
            )
        } else {
            Uri.fromFile(file)
        }
    }
    
    /**
     * 创建图片选择意图
     */
    fun createGalleryIntent(): Intent {
        val intent = Intent(Intent.ACTION_PICK)
        intent.type = "image/*"
        return intent
    }
    
    /**
     * 创建拍照意图
     */
    fun createCameraIntent(context: Context, photoFile: File): Intent {
        val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, getFileUri(context, photoFile))
        return takePictureIntent
    }
    
    /**
     * 检查文件是否存在
     */
    fun fileExists(filePath: String): Boolean {
        return File(filePath).exists()
    }
    
    /**
     * 删除文件
     */
    fun deleteFile(filePath: String): Boolean {
        return File(filePath).delete()
    }
    
    /**
     * 格式化金额
     */
    fun formatPrice(price: Double): String {
        return String.format("¥%.2f", price)
    }
    
    /**
     * 格式化日期时间
     */
    fun formatDateTime(date: Date): String {
        val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
        return dateFormat.format(date)
    }
    
    /**
     * 获取应用数据目录
     */
    fun getAppDataDir(context: Context): File {
        return context.filesDir
    }
    
    /**
     * 创建目录
     */
    fun createDirectory(directoryPath: String): Boolean {
        val directory = File(directoryPath)
        return if (!directory.exists()) {
            directory.mkdirs()
        } else {
            true
        }
    }
    
    /**
     * 检查字符串是否为空
     */
    fun isEmpty(str: String?): Boolean {
        return str == null || str.trim().isEmpty()
    }
    
    /**
     * 检查集合是否为空
     */
    fun <T> isEmpty(collection: Collection<T>?): Boolean {
        return collection == null || collection.isEmpty()
    }
}